package gee

import (
	"fmt"
	"net/http"
)


// 定义一个方法类型
type HandlerFunc func(w http.ResponseWriter, req *http.Request)

type Engine struct {
	// 此字典是为了存储 路由和对应处理逻辑函数的对应关系
	router map[string]HandlerFunc
}

func New() *Engine {
	// 初始化
	return &Engine{router: make(map[string]HandlerFunc)}
}
// 注册路由
func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) {
	key := method + "-" + pattern
	engine.router[key] = handler
}

// 注册GET方法的路由
func (engine *Engine) GET(pattern string, handler HandlerFunc) {
	engine.addRoute("GET", pattern, handler)

}
// 注册POST方法的路由
func (engine *Engine) POST(pattern string, handler HandlerFunc) {
	engine.addRoute("POST", pattern, handler)
}

// 启动web服务

func (engine *Engine) Run(addr string) (err error) {
	return http.ListenAndServe(addr, engine)
}
// 实现 ServeHTTP方法，处理所有的 http 请求
// 接口我喜欢把它比作为 现实中的工作岗位，有能力担任此职位的人也叫 实例实现了此接口
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	key := req.Method + "-" + req.URL.Path
	if handler, ok := engine.router[key]; ok {
		// 使用具体的方法处理对应的 http请求 处理请求以及构造响应
		handler(w, req)
	} else {
		fmt.Fprintf(w, "出错喽！！！！！！！！！！！！！！！！！！！！！！！")
	}
}


